package com.gyp.utils;

import com.gyp.constant.WxPayJsApiConstant;
import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
import com.wechat.pay.contrib.apache.httpclient.auth.Signer;
import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.ArrayList;
import java.util.Base64;

/**
 * @ClassName WxPayJsApiSignUtil
 * @Description TODO
 * @Author 俞春旺
 * @Company RBGT
 * @Date 2023年4月22日 0022 下午 04:39:33
 * @Version 1.0
 */
@Component
@Data
public class WxPayJsApiSignUtil {

    /**
     * mchSerialNo
     **/
    @Value("${wx.pay.merchantSerialNumber}")
    String mchSerialNo;



    /**
     * 操作 - 数据加密
     *
     * @param message 消息信息
     * @return java.lang.String
     * @Author 俞春旺
     * @Date 下午 01:24:56 2023年4月21日 0021
     **/
    public String signV3(byte[] message) throws IOException {
        // 构建 - 签名工具类
        PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, getPrivateKey(WxPayJsApiHttpUtil.getResourcesPath() + WxPayJsApiConstant.SIGN_API_CLIENT_KEY));
        return privateKeySigner.sign(message).getSign();
    }

    /**
     * 获取私钥。
     * 这是个静态方法，可以直接用类名调用
     *
     * @param filename 私钥文件路径  (required)
     * @return 私钥对象
     * <p>
     * 完全不需要修改，注意此方法也是去掉了头部和尾部，注意文件路径名
     */
    public static PrivateKey getPrivateKey(String filename) throws IOException {
        String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");
        return PemUtil.loadPrivateKey(content);
    }

    /**
     * 转换 - 加密数据
     *
     * @param signMessage
     * @return java.lang.String
     * @Author 俞春旺
     * @Date 下午 01:19:45 2023年4月21日 0021
     **/
    public static String buildSignMessage(ArrayList<String> signMessage) {
        if (signMessage == null || signMessage.size() <= 0) {
            return null;
        }
        StringBuilder sbf = new StringBuilder();
        for (String str : signMessage) {
            sbf.append(str).append("\n");
        }
        return sbf.toString();
    }
}
